package main

import (
	"context"
	"errors"
	"fmt"
	"log"
	"match-server/config"
	"net"
	"os"
	"os/signal"
	"syscall"

	"match-server/match-grpc"
	"match-server/pvp"
	pb "pb/proto"

	"google.golang.org/grpc"
)

func main() {
	log.SetFlags(log.Ltime | log.Lmicroseconds)
	log.Println("匹配服务器启动中...")

	// 创建带取消的上下文
	serverCtx, serverCancel := context.WithCancel(context.Background())
	defer serverCancel()

	// 加载配置
	err := config.InitGlobalConfig("config.yaml")
	if err != nil {
		log.Fatalf("加载配置错误: %v", err)
		return
	}

	// 启动匹配管理
	pvp.InitMatchService(serverCtx)

	grpcConfig := config.GlobalConfig.GrpcServerConfig
	listenAddr := fmt.Sprintf("%s:%d", grpcConfig.Host, grpcConfig.Port)

	listen, err := net.Listen("tcp", listenAddr)
	if err != nil {
		log.Fatalf("端口监听失败 %s: %v", listenAddr, err)
	}
	log.Printf("服务器正在监听 %s", listenAddr)

	// grpc服务器
	server := grpc.NewServer()
	pb.RegisterMatcherGrpcServiceServer(server, &match_grpc.MatcherGrpcService{})

	// 优雅关闭处理
	go func() {
		sigChan := make(chan os.Signal, 1)
		signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
		sig := <-sigChan
		log.Printf("接收到信号: %v，开始优雅关闭...", sig)

		server.GracefulStop()
		log.Println("gRPC 服务器已停止")

		serverCancel()
		log.Println("上下文已取消")

		log.Println("服务器已优雅关闭")
	}()

	log.Println("启动 gRPC 服务...")
	if err := server.Serve(listen); err != nil && !errors.Is(err, grpc.ErrServerStopped) {
		log.Fatalf("启动 gRPC 服务失败: %v", err)
	}

	log.Println("服务主流程结束")
}
